/* 
    数据库--后端用来存储数据---数据保存到服务器上（数据库）

    前端不能直接操作数据--一般通过调用后端提供的接口--间接的操作了数据库

        数据库 
            1-关系型数据库  类似 excel表 -- 一次存一行数据--每行数据都有关系--
                mysql  sqlserver-sqlite

            2-非关系型数据---key-value --键值数据库--类似 前端 localstorage
                redis----localstorage


           Mongodb   既能当 关系型数据库，也能到 非关系型   
*/

/*
     1- 安装了mongoDB 
     2- npm i mongoose ---通过代码操作 数据库
     3- js代码使用 mongoose
*/

/* 
     连接数据库

*/
let mongoose = require("mongoose");
let url = "mongodb://127.0.0.1:27017/2309";
mongoose
  .connect(url)
  .then((r) => {
    // console.log(r);
    console.log("链接数据库成功");
  })
  .catch((err) => {
    console.log(err);
    console.log("链接失败");
  });

/* 
    操作数据数据

    1- 创建表结构
        mongoose.Schema({表的字段名：字段类型})
    2- 创建表操作模型 model--得到一个对象，通过模型对象就可以操作数据库    

        
    3- 通过模型对象就可以操作数据库中的某一个表CRUD
    4-  创建-添加数据
        
  */
// 1- 创建表结构

let todosSchema = new mongoose.Schema(
  {
    // 定义title字段 类型是字符串
    title: String,
    content: String,
    //   completed: Number,
    completed: {
      // completed 字段 类型为 Number类型
      type: Number,
      default: 0, // 默认值是0
    },
  },

  //启用时间戳时，Mongoose 会将 createdAt 和 updatedAt 属性添加到模型中。表中添加一行数据的时候会产生时间戳，记录，数据的创建时间和修改时间
  { timestamps: true }
);

// 2- 创建表操作模型 model--得到一个对象，通过模型对象就可以操作数据库
// 参数1--表名字-- 参数2-表的结构
let Todo = mongoose.model("Todo", todosSchema);

let Schema = mongoose.Schema;
let userSchema = new Schema(
  {
    username: String,
    password: String,
    nickname: String,
    headImgUrl: String,
  },
  {
    timestamps: true, //启用时间戳时
  }
);

let User = mongoose.model("User", userSchema);

//新建文章表结构
let ArticleSchema = new Schema(
  {
    title: String, //文章标题
    content: String, //文章内容
    tag: String, //文章分类
    author: { type: Schema.Types.ObjectId, ref: "User" }, //文章的作者
    views: {
      type: Number,
      default: 0,
    }, //文章的浏览量
  },
  {
    timestamps: true, //启用时间戳时，Mongoose 会将 createdAt 和 updatedAt 属性添加到模型中。表中添加一行数据的时候会产生时间戳，记录，数据的创建时间和修改时间
  }
);
var Article = mongoose.model("Aritcle", ArticleSchema);

module.exports = { Todo, User, Article };

//创建数据-插入数据
// Todo.create({ title: "明天记录带xxx回家", completed: 1 }).then((r) => {
//   console.log(r);
// });

// for (var i = 0; i < 100; i++) {
//   Todo.create({ title: "明天记录带xxx回家" + i, completed: 1 }).then((r) => {
//     console.log(r);
//   });
// }

// let axios = require("axios");
// let hotUrl = "https://weibo.com/ajax/side/hotSearch";
// axios.get(hotUrl).then((r) => {
//   r.data.data.realtime.forEach((v) => {
//     v.note;
//     Todo.create({ title: v.note, completed: 1 }).then((r) => {
//       console.log(r);
//     });
//   });
// });

/* 
  删除数据--根据id删除 数据
*/

let id = "6513dc22d4641b3c185eea7e";
// 删除id为1的一条数据
// Todo.deleteOne({ _id: "1" });
// 删除 一条 title 为a 并且 completed为的数据
// Todo.deleteOne({ title:'a',completed:1 });
// Todo.deleteMany({})

// 删除所有completed 为1的数据
// Todo.deleteMany({completed:1 });
// Todo.deleteOne({ _id: id }).then((r) => {
//   console.log(r);//{ acknowledged: true, deletedCount: 1 }
// });

// 根据id删除
// Todo.findByIdAndDelete("6513e2a069fe133f897de57e").then((r) => {
//   console.log(r);
// });

// 改--修改

/* 

第一个参数 对象 是一个条件

第二个参数对象是一个要修改的内容

*/
// Todo.updateOne({ _id: "6513e2a069fe133f897de57f" }, { title: "aaa" }).then(
//   (r) => {
//     console.log(r);
//   }
// );

// Todo.updateOne({ _id: "6513e2a069fe133f897de57f" }, { completed: 0 }).then(
//   (r) => {
//     console.log(r);
//   }
// );

// 修改所有的数据的 completed为 0
// Todo.updateMany({}, { completed: 0 }).then((r) => {
//   console.log(r);
// });

// Todo.findByIdAndUpdate(
//   "6513e2a069fe133f897de57f",

//   //   $inc: { completed: 1 }   completed 增加1
//   { title: "ccc", $inc: { completed: -1 } },
//   { new: true } //new ：True  查询到 修改以后的数据
// ).then((r) => {
//   console.log(r);
// });

/* 
  查询数据
*/

// 根据id查询详情
// Todo.findById("6513e2a069fe133f897de57f").then((r) => {
//   console.log(r);
// });
// Todo.findOne({ _id: "6513e2a069fe133f897de57f" }).then((r) => {
//   console.log(r);
// });

// 查询 title 为aa的一条数据
// Todo.findOne({ title: "aa" }).then((r) => {
//   console.log(r);
// });

// 查询 title 包含 回家 的 所有 todo
// let str = "回家";
// let reg = new RegExp(str);
// Todo.find({ title: reg }).then((r) => {
//   console.log(r.length);
// });
// Todo.find({ title: /回家/ }).then((r) => {
//   // r 查询结果是 数组
//   console.log(r.length);
// });

// Todo.find({
//   views: { $gte: 0, $lt: 1000 }, //范围  views的值 大于等于0 小于 1000
// });

// Todo.find({
//   completed: { $gte: 1 }, //范围  completed的值 大于等于1
// }).then((r) => {
//   console.log(r);
// });

let pagenum = 1;
let pagesize = 10;

// Todo.find()
//   .sort({ _id: -1 }) //根据id降序
//   .sort({ _id: 1 })//根据id 升序

//   //   第一页的 10 条 数据
//   .skip(0) //跳过前0条
//   .limit(10) //获取10条事件
//   //   第二页的 10 条 数据
//   .skip(10) //跳过前0条
//   .limit(10) //获取10条事件
//   //   第三页的 10 条 数据
//   .skip(20) //跳过前0条
//   .limit(10) //获取10条事件

//   .skip((pagenum - 1) * pagesize) //跳过前0条
//   .limit(pagesize) //获取10条事件

//   .select({ __v: 0, updatedAt: 0 }) //1 查询结果中出现 某一个 字段  0是不出现这个字段

//   .then((r) => {
//     console.log(r);
//   });
